package xuecheng.spring.boot.start.common.json;

import java.util.Date;
import java.util.List;

/**
 * json 工具类接口
 *
 * @author PengXueCheng
 * @version 1.0.0
 * @mail yingcheng1016@gmail.com
 * @date 2019/4/25 10:05
 * @desc
 */
public interface JsonUtils {

    /**
     * 对象转为 json
     *
     * @param src java 对象
     * @return json 字符串
     */
    String toJson(Object src);

    /**
     * json 转为对象
     *
     * @param json     json 字符串
     * @param classOfT 目标对象字节码
     * @param <T>      目标对象类型
     * @return java 对象
     */
    <T> T fromJsonAsObject(String json, Class<T> classOfT);

    /**
     * json 转为数组, 集合
     *
     * @param <T>      目标对象类型
     * @param json     json 字符串
     * @param classOfT 集合条目对象字节码
     * @return java 对象
     */
    <T> List<T> fromJsonAsArray(String json, Class<T> classOfT);

    /**
     * 解析 json 字段, 返回指定字段的 string 值
     *
     * @param json       要解析的 json 字符串
     * @param memberName 字段名
     * @return 字段值
     */
    String getAsString(String json, String memberName);

    /**
     * 解析 json 字段, 返回指定字段的 int 值
     *
     * @param json       要解析的 json 字符串
     * @param memberName 字段名
     * @return 字段值
     */
    int getAsInt(String json, String memberName);

    /**
     * 解析 json 字段, 返回指定字段的 Date 值
     *
     * @param json       要解析的 json 字符串
     * @param memberName 字段名
     * @return 字段值
     */
    Date getAsDate(String json, String memberName);

    /**
     * 解析 json 字段, 返回指定字段的 boolean 值
     *
     * @param json       要解析的 json 字符串
     * @param memberName 字段名
     * @return 字段值
     */
    boolean getAsBoolean(String json, String memberName);

    /**
     * 解析 json 字段, 将字段值解析到指定的实体中
     *
     * @param json       要解析的 json
     * @param memberName 字段名称
     * @param classOfT   实体字节码
     * @param <T>
     * @return 字段值的实体对象
     */
    <T> T getAsObj(String json, String memberName, Class<T> classOfT);

}
